/*
 * 模板对于学习C++的同学，其实并不陌生。函数有模板函数，类也有模板类。那么这个模板模式是个什么情况？
 *
 * 我们可以思考一下，模板的本质是什么。比如说，现在我们需要编写一个简单的比较模板函数。
 */

template <typename type>  
int compare (type a, type b)  
{  
    return a > b ? 1 : 0;  
}      

template <typename type>
int compare (type a, type b)
{
    return a > b ? 1 : 0;
}    

/* 
 * 模板函数提示我们，只要比较的逻辑是确定的，那么不管是什么数据类型，都会得到一个相应的结果。
 * 
 * 固然，这个比较的流程比较简单，即使没有采用模板函数也没有关系。但是，要是需要拆分的步骤很多，
 *
 * 那么又该怎么办呢？如果相通了这个问题，那么也就明白了什么是template模式。 
 *
 * 比方说，现在我们需要设计一个流程。这个流程有很多小的步骤完成。
 * 
 * 然而，其中每一个步骤的方法是多种多样的，我们可以很多选择。但是，所有步骤构成的逻辑是唯一的，
 * 
 * 那么我们该怎么办呢？其实也简单。那就是在基类中除了流程函数外，其他的步骤函数全部设置为virtual函数即可。
 */


class basic
{
public:
    void basic() {}
    virtual ~basic() {}
    virtual void step1() {}
    virtual void step2() {}
    void process()
    {
        step1();
        step2();
    }
};

/*
 * basic的类说明了基本的流程process是唯一的，所以我们要做的就是对step1和step2进行改写。 
 */

class data_A : public basic  
{  
public:  
    data_A() {}  
    ~data_A() {}  
    void step1()   
    {  
        printf("step 1 in data_A!\n");  
    }  
  
    void step2()  
    {  
        printf("step 2 in data_A!\n");  
    }  
};  


/*
 * 这里的template主要是一种流程上的统一，细节实现上的分离。明白了这个思想，
 * 
 * 那么用C语言来描述template模式就不是什么难事了。
 */
typedef struct basic
{
	void * pdata;
	void (*step1)(struct basic * pbasic);
	void (*step2)(struct basic * pbasic);
	void (*process)(struct basic * pbasic);
}basic;

/*
 * 因为在C++中process函数是直接继承的，C语言下面没有这个机制。
 *
 * 所以，对于每一个process来说，process函数都是唯一的，但是我们每一次操作的时候还是要去复制一遍函数指针。
 *
 * 而step1和step2是不同的，所以各种方法可以用来灵活修改自己的处理逻辑，没有问题。 
 */
void process(struct basic * pbasic)
{
	pbasic->step1(pbasic);
	pbasic->step2(pbasic);
}
